package basics;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;

import miniBanco.Core.TipoConcepto;
import miniBanco.Core.Moneda;
import miniBanco.Mapper.MapperRegistry;

public class TableManager {

	private static TableManager instance = null;
    MySqlHelper mySqlHelper;
    MapperRegistry mapperRegistry;
	private static final String TAG = TableManager.class.getSimpleName();
	private TableManager() {
	 	mySqlHelper = MySqlHelper.getInstance(); 
	 	mapperRegistry = MapperRegistry.GetInstance();
	 	
		Connection con = DBManager.connect();
		try
		{
			DatabaseMetaData dbm = con.getMetaData();
			// check if "employee" table is there
			ResultSet res = dbm.getTables(null, null, "usuarios", null);
			
			if (res.next()) {
			  // Table exists
			}
			else {
				dropLogTable();
				createLogTable();
				dropErroresTable();
				createErroresTable();		
	
				CrearTablasSistema();
			}
		}
		catch(Exception ex)
		{
			
		}
		finally
		{
			try {
				con.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}


	}

/*	private void VerificarSistema(){
		StringBuilder sb = new StringBuilder();
		sb.append("SELECT COUNT(*) FROM Moneda");
		String sql = sb.toString();

		try {
			ResultSet rs = mySqlHelper.ExecuteQuery(sql, TAG);
			rs.next();
			int cantidad = rs.getInt(1);
		
		}
		catch(HandledSQLException ex)
		{
			CrearTablasSistema();
		} catch (Exception ex) {
			DBManager.Error(ex);
			throw new HandledException("Se produjo un error inesperado. Ver log");
		}
	}*/
	public void CrearTablasSistema()
	{
		dropTipoCuenta();
		createTipoCuenta();
		dropMoneda();
		createMoneda();
		dropConceptos();
		createConceptos();	
		createClienteTable();
		createCuentaTable();
		createMovimientos();
		createUserTable();
	}
	
	public void DropTablasSistema()
	{
		dropClienteTable();
		dropCuentaTable();
		dropTipoCuenta();
		dropMoneda();
		dropMovimientos();
		dropConceptos();
		//dropUserTable();
	}
	public static TableManager getInstance() {
	  if(instance == null) {
	     instance = new TableManager();
	  }
	  return instance;
	}
	
	private void createUserTable()  {
		String sql = "CREATE TABLE usuarios ( id INTEGER IDENTITY, user VARCHAR(256), email VARCHAR(256), pass VARCHAR(10))";	
		try
		{
			mySqlHelper.ExecuteNonQuery(sql, TAG);
		}catch(Exception ex)
		{
			
		}
		
	}
	
	private void dropUserTable() {
		String sql = "DROP TABLE usuarios";
		try
		{
			mySqlHelper.ExecuteNonQuery(sql, TAG);
		}catch(Exception ex)
		{
			
		}
	}

	public void createLogTable()
	{
		String sql = "CREATE TABLE Log ( id INTEGER IDENTITY, Tag VARCHAR(256), Mensaje VARCHAR(256))";
		try
		{
			mySqlHelper.ExecuteNonQuery(sql);
		}catch(Exception ex)
		{
			
		}
	}
	
	public void dropLogTable()
	{
		String sql = "DROP TABLE Log";
		try
		{
			mySqlHelper.ExecuteNonQuery(sql);
		}catch(Exception ex)
		{
			
		};
	}
	
	private void createErroresTable()
	{
		String sql = "CREATE TABLE Errores ( id INTEGER IDENTITY, Message VARCHAR(256), StackTrace VARCHAR(256))";
		try
		{
			mySqlHelper.ExecuteNonQuery(sql, TAG);
		}catch(Exception ex)
		{
			
		}
	}

	private void dropErroresTable()
	{
		String sql = "DROP TABLE Errores";
		try
		{
			mySqlHelper.ExecuteNonQuery(sql, TAG);
		}catch(Exception ex)
		{
			
		}
	}

	public void createConceptos()
	{
		String sql = "CREATE TABLE TipoConcepto (tipoConcepto INTEGER,esPositivo Boolean, Nombre Varchar(250))";
		try
		{
			mySqlHelper.ExecuteNonQuery(sql, TAG);
		}catch(Exception ex)
		{
			
		}
		
		String insertSql = "Insert Into TipoConcepto (tipoConcepto,Nombre,esPositivo) Values (%d,'%s',%b)";
		//Inserto Deposito
		sql = String.format(insertSql, TipoConcepto.Deposito.getValue(), TipoConcepto.Deposito.toString(),true);
		mySqlHelper.ExecuteNonQuery(sql, TAG);
		//Inserto Extracciones
		sql = String.format(insertSql, TipoConcepto.Extracciones.getValue(), TipoConcepto.Extracciones.toString(),true);
		mySqlHelper.ExecuteNonQuery(sql, TAG);
		//
		sql = String.format(insertSql, TipoConcepto.Transferencia.getValue(), TipoConcepto.Transferencia.toString(),true);
		mySqlHelper.ExecuteNonQuery(sql, TAG);
	}
	
	public void dropConceptos()
	{
		String sql = "DROP TABLE TipoConcepto";
		try
		{
			mySqlHelper.ExecuteNonQuery(sql, TAG);
		}catch(Exception ex)
		{
			
		}

	}
	
	public void createMovimientos()
	{
		String sql = "CREATE TABLE Movimientos (id INTEGER IDENTITY,idCuenta INTEGER, Fecha Date,TipoConcepto Integer, Importe Decimal(10,2),Descripcion Varchar(250) )";
		try
		{
			mySqlHelper.ExecuteNonQuery(sql, TAG);
		}catch(Exception ex)
		{
			
		}
	}
	
	public void dropMovimientos()
	{
		String sql = "DROP TABLE Movimientos";
		try
		{
			mySqlHelper.ExecuteNonQuery(sql, TAG);
		}catch(Exception ex)
		{
			
		}
	}
	public void createMoneda()
	{
		String sql = "CREATE TABLE Moneda (Moneda INTEGER, Descripcion VARCHAR(256) )";
		mySqlHelper.ExecuteNonQuery(sql, TAG);
		String insertSql = "Insert Into Moneda (Moneda,Descripcion) Values (%d,'%s')";
		//Inserto Pesos
		sql = String.format(insertSql, Moneda.Pesos.getValue(), Moneda.Pesos.toString());
		mySqlHelper.ExecuteNonQuery(sql, TAG);
		//Inserto Dolar
		sql = String.format(insertSql, Moneda.Dolar.getValue(), Moneda.Dolar.toString());
		mySqlHelper.ExecuteNonQuery(sql, TAG);
	}
	
	public void dropMoneda()
	{
		String sql = "DROP TABLE Moneda";
		try
		{
			mySqlHelper.ExecuteNonQuery(sql, TAG);
		}catch(Exception ex)
		{
			
		}
	}
	public void createTipoCuenta()
	{
		String sql = "CREATE TABLE TipoCuenta (TipoCuenta INTEGER, Descripcion VARCHAR(256) )";
		mySqlHelper.ExecuteNonQuery(sql, TAG);
		
		String insertSql = "Insert Into TipoCuenta (TipoCuenta,Descripcion) Values (%d,'%s')";
		//Caja ahorro
		sql = String.format(insertSql, 1, "Caja de Ahorro");
		mySqlHelper.ExecuteNonQuery(sql, TAG);
		//Cuenta sueldo
		sql = String.format(insertSql, 2, "Cuenta sueldo");
		mySqlHelper.ExecuteNonQuery(sql, TAG);
		
	}
	public void dropTipoCuenta()
	{
		String sql = "DROP TABLE TipoCuenta";
		try
		{
			mySqlHelper.ExecuteNonQuery(sql, TAG);
		}catch(Exception ex)
		{
			
		}
	}
	public void createCuentaTable()
	{
		String sql = "CREATE TABLE ClienteCuenta ( id INTEGER IDENTITY, idCliente INTEGER,Moneda INTEGER,Cbu INTEGER, Saldo Decimal(10,2), Activa Integer,TipoCuenta Integer)";
		try
		{
			mySqlHelper.ExecuteNonQuery(sql, TAG);
		}catch(Exception ex)
		{
			
		}
	}
	public void dropCuentaTable()
	{
		String sql = "drop TABLE ClienteCuenta";
		try
		{
			mySqlHelper.ExecuteNonQuery(sql, TAG);
		}catch(Exception ex)
		{
			
		}
	}
	public void createClienteTable()
	{
		String sql = "CREATE TABLE Cliente ( id INTEGER IDENTITY, Dni INTEGER,Nombre VARCHAR(256),Cuit INTEGER, Activo INTEGER, NroCliente Integer,TipoCliente INTEGER)";
		try
		{
			mySqlHelper.ExecuteNonQuery(sql, TAG);
		}catch(Exception ex)
		{
			
		}
	}
	
	public void dropClienteTable()
	{
		String sql = "DROP TABLE Cliente";
		try
		{
			mySqlHelper.ExecuteNonQuery(sql, TAG);
		}catch(Exception ex)
		{
			
		}
	}

	
}
